<?php
/**
 * Controller_Ajax_Order
 *
 * Класс Controller_Ajax_Order отвечает за обработку запросов связанных с заказами
 */
class Controller_Ajax_Order extends Controller_Ajax {

	/**
	 * (non-PHPdoc)
	 *
	 */
	public function actionSwitch() {
	  Service_Debug::setDebug();
		switch ($this->arrRequest[2]) {
			case 'before_add_checking':
				$this->actionCheck();
				break;
			case 'comment':
				$this->actionComment();
				break;
			case 'admin-controls':
				$this->actionAdminControls();
				break;
			case 'fast-order':
				$this->actionFastOrder();
				break;
			case 'get-route-orders':
				$this->actionGetRouteOrders();
				break;
			default: $this->setError(404);
 		}
	}

	
	/**
	 * Проверяет поля (города, почта, капча) на правильность ввода на странице добавления заказа
	 *
	 */
	public function actionCheck () {
		Service_Debug::setDebug();
	 	$objSession = User_Session::instance();
	 	$resultArray = array();
	 	
	 	$cityFromString = isset($_POST['city_from_string']) ? Service_Escape::absolutelyEscapeString($_POST['city_from_string']) : '';
	 	$cityToString = isset($_POST['city_to_string']) ? Service_Escape::absolutelyEscapeString($_POST['city_to_string']) : '';
	 	$eMail = isset($_POST['e_mail']) ? Service_Escape::absolutelyEscapeString($_POST['e_mail']) : '';
	 	$driver = isset($_POST['driver']) ? Service_Escape::absolutelyEscapeString($_POST['driver']) : '';
	 	
	 	// Если есть неполученные данные
	 	if((!$objSession->isLoggedIn() && (empty($cityFromString) || empty($cityToString) || empty($eMail))) || 
	 		($objSession->isLoggedIn() && (empty($cityFromString) || empty($cityToString))))  return $this->makeStandardError('Не получены данные');
	 		
	 	$objCity = new City();
	 	if(!$objCity->getIdByName($cityFromString))  $resultArray['city_from'] = 'FAIL';
	 	if(!$objCity->getIdByName($cityToString))  $resultArray['city_to'] = 'FAIL';
	 	
	 	// Для незалогиненого пользователя проверяем правильность капчи и уникальность почты
	 	if(!$objSession->isLoggedIn()) {
	 		if(User_User::isEMailExist($eMail)) $resultArray['e_mail'] = 'FAIL';
	 		else $resultArray['e_mail'] = 'OK';
	 	}
	 	
	 	// Если редактирует админ, и что-то записано в поле водителя, проверяем существование такого водителя
	 	if(SimpleAdministration::isAdmin() && !empty($driver)) {
	 		$arrdriverNames = explode(' ',$driver); // Разбиваем строку на фамилию и имя
	 		// Если в поле ввели имя и фамилию
	 		if(!empty($arrdriverNames[0]) && !empty($arrdriverNames[1])) {
	 			$objDriver = new Driver();
	 			$id = $objDriver->find('all', array('select' => '`driver`.`ID_driver`', 'conditions' => "`driver`.`last_name`='" . $arrdriverNames[0] . "' AND `driver`.`first_name`='" . $arrdriverNames[1] . "'"));
	 			$resultArray['driver'] = $id ? $id : 'FAIL';
	 		}
	 		else $resultArray['driver'] = 'FAIL';
	 	}
	 	
	 	$this->arrReturn = $resultArray;
	}
	
	/**
	 * Добавляет комментарий к заказу (от заказчика или от админа)
	 *
	 */
	public function actionComment () {
		Service_Debug::setDebug();
		$objSession = User_Session::instance();
		$resultArray = array();
		 
		$userId = isset($_POST['ID_user']) ? Service_Escape::absolutelyEscapeString($_POST['ID_user']) : '';
		$orderId = isset($_POST['ID_order']) ? Service_Escape::absolutelyEscapeString($_POST['ID_order']) : '';
		$text = isset($_POST['text']) ? Service_Escape::absolutelyEscapeString($_POST['text']) : '';
		 
		// Если есть неполученные данные или же комментарий пытается добавить юзер, не имеющий на это прав
		if(empty($userId) || empty($orderId) || empty($text))  return $this->makeStandardError('Не получены данные');
		elseif(!SimpleAdministration::isAdmin() && !SimpleAdministration::isAuthor($userId)) return $this->makeStandardError('Нет прав!');
	
		$objOrder = new Order($orderId);
		
		if($objOrder->id) {
			$objOrderComment = new OrderComment();
			$objOrderComment->setFields(array('ID_order' => $orderId, 'ID_user' => $userId, 'text' => $text));
			if($objOrderComment->save()) {
				
				// Верстка блока нового комментария
				$newCommentBlock = '<div class="comment-block">' . 
										(SimpleAdministration::isAdmin() ? '<div class="comment-icon-admin"></div> 
																			<div class="simple-content">Администратор № ' . User_User::getId() . '</div>' 
																		 : '<div class="comment-icon-user"></div>
																			<div class="simple-content">Вы</div>') . 
										'<div class="comment-text">' . $text . '</div>
									</div>';
				$this->arrReturn = array('result' => 'OK','newCommentBLock' => $newCommentBlock, 'post' => $_POST); 
			}
		}
	}
	
	/**
	 * Обрабатывает запросы связзаные с управлением заказа (клиент согласен, заказ отменён....)
	 *
	 */
	public function actionAdminControls () {
		if(!SimpleAdministration::isAdmin()) return $this->makeStandardError('Нет прав!');
		$orderId = isset($_POST['ID_order']) ? Service_Escape::absolutelyEscapeString($_POST['ID_order']) : '';
		$requestType = isset($_POST['requestType']) ? Service_Escape::absolutelyEscapeString($_POST['requestType']) : '';
		$commentText = isset($_POST['commentText']) ? Service_Escape::absolutelyEscapeString($_POST['commentText']) : '';
		
		if(empty($orderId) || empty($requestType))  return $this->makeStandardError('Не получены данные');
		
		$objOrder = new Order ($orderId);
		if(!$objOrder->id) return $this->makeStandardError('Несуществующий заказ');
		switch($requestType) { // Определяем изменяемую опцию
			case 'client_agree' :
				if($objOrder->getField('client_agree') == '0') {
					if($objOrder->updateField('client_agree', 1)) {
						// При указании согласия клиента надо добавить новые кнопки : "загружено", "оплачено водителю" , "оплачено клиентом"
						$newButton = '<div class="control-item"><input type="checkbox" id="loaded" class="filter-checkbox"><label for="loaded">Загружено</label></div>
									<div class="control-item"><input type="checkbox" id="client-pay" class="filter-checkbox"><label for="client-pay">Оплачено клиентом</label></div>
									<div class="control-item"><input type="checkbox" id="driver-pay" class="filter-checkbox"><label for="driver-pay">Оплачено водителю</label></div>';
						$this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'add', 'new_button' => $newButton));
					}
				}
				else if($objOrder->updateFields(array('client_agree' => 0, 'loaded' => 0, 'unloaded' => 0, 'client_pay' => 0, 'driver_pay' => 0))) $this->arrReturn = array('result' => 'OK', 'actions' => array( 'type' => 'del'));
				break;
			case 'canceled' :
				if($objOrder->getField('canceled') == '0') {
					if(empty($commentText)) return $this->makeStandardError('Не получены данные');
					if($objOrder->updateFields(array('canceled' => 1, 'canceled_comment' => $commentText))) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'add'));
				}
				else if($objOrder->updateFields(array('canceled' => 0, 'canceled_comment' => ''))) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'del'));
				break;
			case 'loaded' :
				if($objOrder->getField('loaded') == '0') {
					// При указании "загружено" должна появиться кнопка "выгружено"
					$newButton = '<div class="control-item"><input type="checkbox" id="unloaded" class="filter-checkbox"><label for="unloaded">Выгружено</label></div>';
					if($objOrder->updateField('loaded', 1)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'add','new_button' => $newButton));
				}
				else if($objOrder->updateFields(array('loaded' => 0, 'unloaded' => 0))) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'del'));
				break;
			case 'unloaded' :
				if($objOrder->getField('unloaded') == '0') {
					if($objOrder->updateField('unloaded', 1)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'add'));
				}
				else if($objOrder->updateField('unloaded', 0)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'del'));
				break;
			case 'client-pay' :
				if($objOrder->getField('client_pay') == '0') {
					if($objOrder->updateField('client_pay', 1)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'add'));
				}
				else if($objOrder->updateField('client_pay', 0)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'del'));
				break;
			case 'driver-pay' :
				if($objOrder->getField('driver_pay') == '0') {
					if($objOrder->updateField('driver_pay', 1)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'add'));
				}
				else if($objOrder->updateField('driver_pay', 0)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'del'));
				break;
			case 'call-to-client' :		// Флаг для быстрых заказов, означающий, что клиенту позвонили
				if($objOrder->getField('call_to_client') == '0') {
					if($objOrder->updateField('call_to_client', 1)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'add'));
				}
				else if($objOrder->updateField('call_to_client', 0)) $this->arrReturn = array('result' => 'OK', 'actions' => array('type' => 'del'));
				break;
				
			default :
				return $this->makeStandardError('Недопустимые параметры');
		}
	}
	
	// Метод осуществялет добавление быстрого заказа
	public function actionFastOrder() {
		// может только залогиненный должен добавлять!?!
		$cityFromString = isset($_POST['city_from']) ? Service_Escape::absolutelyEscapeString($_POST['city_from']) : '';
	 	$cityToString = isset($_POST['city_to']) ? Service_Escape::absolutelyEscapeString($_POST['city_to']) : '';
	 	$phone = isset($_POST['phone']) ? Service_Escape::absolutelyEscapeString($_POST['phone']) : '';
	 	$description = isset($_POST['description']) ? Service_Escape::absolutelyEscapeString($_POST['description']) : '';
	 	$resultArray = array();
	 	
	 	// Если есть неполученные данные
	 	if(empty($cityToString) || empty($cityFromString) || empty($phone) || empty($description)) return $this->makeStandardError('Не получены данные');
	 	
	 	$objCity = new City();
	 	if(!($idCityFrom = $objCity->getIdByName($cityFromString)))  $resultArray['city_from'] = 'FAIL';
	 	if(!($idCityTo =$objCity->getIdByName($cityToString)))  $resultArray['city_to'] = 'FAIL';
		
		if(count($resultArray)) $this->arrReturn = $resultArray;
		else {
			$objOrder = new Order(array('city_from' => $idCityFrom, 'city_to' => $idCityTo, 'one_phone' => $phone, 'description' => $description, 'is_fast_order' => 1));
			if($objOrder->save()) $this->arrReturn = array('result' => 'OK');
		}
	}
	
	/**
	 * Метод осуществляет поиск маршрута и набора заказов для него. Используется в админке - "Поиск маршрута"
	 */
	public function actionGetRouteOrders() {
		$cityFromString = isset($_POST['from']) ? Service_Escape::absolutelyEscapeString($_POST['from']) : '';
		$cityToString = isset($_POST['to']) ? Service_Escape::absolutelyEscapeString($_POST['to']) : '';
		$resultArray = array();
		
		// Если есть неполученные данные
		if(empty($cityToString) || empty($cityFromString)) return $this->makeStandardError('Не получены данные');
		
		$objCityFrom = new City();
		$objCityTo = new City();
		
		$objCityFrom->find('first', array('conditions' => "`city`.`city_name`='" . $cityFromString . "'"));
		$objCityTo->find('first', array('conditions' => "`city`.`city_name`='" . $cityToString . "'"));
		
		if(!$objCityFrom->id)  $resultArray['city_from'] = 'FAIL';
		if(!$objCityTo->id)  $resultArray['city_to'] = 'FAIL';
		
		if(!empty($resultArray)) $this->arrReturn = $resultArray;
		else  {
			$isCompositive = false;
			$routeArray = Route::getRouteArrayByIds($objCityFrom->id, $objCityTo->id); // Массив отрезков маршрута
			if(empty($routeArray)) { // Если в БД нет заданного маршрута, то формируем составной маршрут из имеющихся
				$isCompositive = true;
				$routeArray = Route::getCompositeRoute($objCityFrom->id, $objCityTo->id);
			}
			
			if(empty($routeArray)) return $this->makeStandardError('NOT_FOUND');
			
			// Вычисляем протяженность маршрута
			$routeLength = 0;
			foreach ($routeArray as $segmentArray) {
				$routeLength += $segmentArray['distance_to_next'];
			}
			// Получаем заказы по маршруту
			$ordersArray = Order::getRouteOrders($objCityFrom->id, $objCityTo->id, $routeLength); 
			
			$this->arrReturn = array('status' => 'OK', 'isCompositive' =>  $isCompositive, 'markersArray' => $routeArray, 'orders' => $ordersArray);

		}
		
	}
}
?>